Op deze pagina vind je een demonstratie van een statistische techniek aan de hand van een voorbeeld.

Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.

De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.



1 Doel

In een ideale wereld beschik je als onderzoeker over een perfect volledig databestand.

In de praktijk zal je echter in veel datasets ook ‘gaten’ tegenkomen. Die gaten worden in R aangegeven met NA. Ze kunnen ontstaan om allerlei redenen. Misschien sloeg iemand een enquêtevraag over, of misschien werkte de apparatuur om een meting uit te voeren niet goed. Hoe dan ook, als onderzoeker zal je …

  1. moeten uitzoeken waar in je dataset zich eventueel ontbrekende data bevinden en
  2. moeten beslissen wat te doen met zulke ontbrekende data.


R kan hierbij helpen. Hieronder demonstreren we hoe.



2 De dataset

De dataset enquete bevat gegevens van 14 variabelen geobserveerd bij 42 Amerikaanse studenten die een vak statistiek volgen.

Deze dataset kan je inladen met read.csv(). De data kan je best meteen in een object enquete onderbrengen zodat je die later makkelijk opnieuw kan oproepen.

enquete <- read.csv("https://statlas.ugent.be/datasets/enquete2.csv")


Met str() krijg je een opsomming van alle variabelen in de dataset. Je vindt er ook telkens bij om welk datatype het gaat. Afhankelijk van het datatype zal je sommige functies wel of juist niet kunnen gebruiken om je data te verkennen. Het heeft bijvoorbeeld geen zin om een gemiddelde te berekenen van een variabele van type chr.

str(enquete) 
'data.frame':   42 obs. of  14 variables:
 $ X          : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Section    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Class      : chr  "Senior" "Freshman" "Freshman" "Freshman" ...
 $ Sex        : chr  "F" "F" "F" "M" ...
 $ Distance   : int  400 450 3000 100 2000 500 1100 1000 400 450 ...
 $ Height     : int  62 61 61 72 69 73 60 71 70 75 ...
 $ Handedness : chr  "Right" "Left" "Right" "Right" ...
 $ Coins      : num  1.12 29 1.5 0.07 0.12 8 0.77 0 0 0 ...
 $ WhiteString: int  42 45 22 40 48 30 50 45 38 36 ...
 $ BlackString: int  6 5 4 4 7 8 0 6 0 12 ...
 $ Reading    : num  80 100 100 50 200 100 200 100 100 100 ...
 $ TV         : num  3 NA 4 25 NA 0 2 2 20 20 ...
 $ Pulse      : int  71 78 80 63 63 56 72 66 54 48 ...
 $ Texting    : int  3 100 2 200 100 1 50 30 40 25 ...


In de output van str() zie je inderdaad dat er 14 variabelen zijn met telkens 42 observaties.


Hier zullen we de vector enquete$TV gebruiken.

tv <- enquete$TV


Merk op: veel van de functies op deze pagina kan je even goed toepassen op een heel dataframe ineens. Het zal echter vaker voorkomen dat je dit variabele per variabele zal willen doen. Daarom spreken we in de voorbeelden hieronder meestal over vectoren en niet over dataframes.


3 Zijn er ontbrekende data?

Een goede start is om te achterhalen of er ontbrekende data zijn in je dataset. Daarvoor is de functie is.na() heel nuttig. Voor elke plaats in een object zal die functie je een waarde TRUE geven indien het element ontbreekt en een FALSE als er wel een element te vinden is op die plaats.

is.na(tv)
 [1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE


Zo’n lange nieuwe vector met allerlei TRUE en FALSE is onoverzichtelijk en niet zo informatief. Op dit moment stel je je de vraag of er ergens in je vector iets ontbreekt. Op die vraag wil je in eerste instantie een eenvoudige ja of nee als antwoord. De functie any() kan hierbij helpen. Die geeft een waarde TRUE als er op tenminste één plaats in de vector een TRUE voorkomt.

any(is.na(tv))
[1] TRUE


Deze output houdt in dat er ergens in je vector een waarde ontbreekt. Daar zal je NA zien staan. Dat is hoe ontbrekende data worden gemarkeerd in R.



4 Waar zitten de ontbrekende data?

Vervolgens moet je uitzoeken op welke plaats in de vector die ontbrekende data zich bevinden. De functie which() vertelt je welke plaatsen in een vector een waarde TRUE bevatten.

which(is.na(tv))
[1] 2 5


Als je de waarde op één van die plaatsen probeert op te roepen, dan zie je inderdaad NA.

tv[2]
[1] NA


De functie length() vertelt je nu hoeveel ontbrekende datapunten er zijn (al heb je in dit geval natuurlijk niet veel hulp nodig bij het tellen).

ontbrekend <- which(is.na(tv))
length(ontbrekend)
[1] 2


Ook het omgekeerde is mogelijk: welke plaatsen in de vector bevatten wél data? Dat kan met een uitroepteken ! in je code. Dat betekent zoveel als het woord “niet”. Alle TRUE worden hierdoor FALSE en omgekeerd.

which(!is.na(tv))
 [1]  1  3  4  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[26] 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Zie je welke getallen ontbreken?



5 Wat kan je doen met ontbrekende data?

Omwille van ontbrekende data zullen veel functies niet meer normaal werken. R zal je bijvoorbeeld niet toestaan om zomaar het gemiddelde te berekenen van een vector met ontbrekende waarden.

mean(tv)
[1] NA


Wat kan je daar nu aan doen?


Ontbrekende data negeren met na.rm

na.rm is een argument dat je in veel functies vindt. Als je kiest voor na.rm = TRUE dan worden alle ontbrekende waarden genegeerd bij het uitvoeren van die functie (“rm” staat voor “remove”).

mean(tv, na.rm=TRUE)
[1] 4.75

Om het gemiddelde te berekenen worden alle observaties (die niet NA zijn) opgeteld en gedeeld door 40, niet door 42.


Ontbrekende data verwijderen met na.omit()

na.omit() is een functie waarmee je alle ontbrekende data uit een vector of een dataframe kan verwijderen.

Hier passen we de functie toe op het dataframe enquete. Je verwijdert dan alle rijen waarin tenminste één keer NA voorkomt. Dat is nogal drastisch en kan ertoe leiden dat je heel wat nuttige data weggooit.

effectief <- na.omit(enquete)


Hoeveel rijen zijn er dan nog over?

dim(effectief)[1]
[1] 39


Zelf waarden invullen

De which-functie geeft je de locaties van de ontbrekende data in de vector (zie eerder). Dit kan je vervolgens gebruiken om die locaties op te vullen met waarden die je zelf kiest.

Je moet natuurlijk heel voorzichtig zijn met waarden invullen die niet bestaan. Het mag enkel als je goed kan verantwoorden waarom je het doet.


ontbrekend <- which(is.na(tv))
tv[ontbrekend] <- 0